package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.util.StringUtils;

import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;
import pe.com.cotelasa.helper.GuiaRemisionPrintHelper;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompAddArticuloStock;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompDirLocProv;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompDirLocProv.SedeSubjectWrapper;
import pe.com.cotelasa.scp.controlador.backingBean.BKGuiaDeRemision;
import pe.com.cotelasa.scp.controlador.backingBean.BKListGuiaDeRemision;
//import pe.com.cotelasa.scp.controlador.backingBean.BKOrdenCompraServicio;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.controlador.comando.ComandoVer;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.KardexModel;
import pe.com.cotelasa.scp.dominio.service.IServicioArticuloSede;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioParametroDetalle;
import pe.com.cotelasa.scp.dominio.service.IServicioSede;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.ArticuloSede;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.PartidaDespacho;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.entidad.GuiaRemision.ESTADO_GUIA_REMISION;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.Proveedor.TIPO_ENTIDAD;
import pe.com.cotelasa.scp.entidad.TipoUnidadMinima;
import pe.com.cotelasa.scp.to.GuiaRemisionTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Salmuz
 */
@SuppressWarnings({"serial", "unchecked"})
public abstract class MBGuiaDeRemision extends MBGenerico implements IMantenedor,
        IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBGuiaDeRemision.class);
    /*@Inject
     private BKOrdenCompraServicio bkOrdenServicio;*/
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Inject
    protected IServicioParametroDetalle servicioParametroDetalle;
    @Inject
    private IServicioGuiaRemision servicioGuiaRemision;
    @Inject
    private MBCompFindOrden mbCompFindOrden;
    @Inject
    private MBCompDirLocProv mbCompDirLocProv;
    @Autowired
    private BKSession session;
    @Inject
    private MBCompOrdenPOrdenCS mbCompOrdenPOrdenCS;
    @Inject
    private BKListGuiaDeRemision bkListGuiaDeRemision;
    @Inject
    private IServicioSede servicioSede;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private KardexModel kardexModel;
    @Inject
    private MBCompAddArticuloStock mbCompAddArticuloStock;
    @Inject
    private BKCompAddArticuloStock bkCompAddArticuloStock;
    @Inject
    private MBComponenteFindProveedor mbComponenteFindProveedor;
    // El componente hijo mediante un @PostConstruct crea la clase
    protected BKGuiaDeRemision bkGuiaDeRemision;

    public MBGuiaDeRemision() {
    }

    // Logica para el formulario
    public Collection<ParametroDetalle> buscarMotivoGuia(String desMotivoGuia) {
        Collection<ParametroDetalle> listaMotivos = new ArrayList<ParametroDetalle>();
        for (ParametroDetalle item : bkGuiaDeRemision.getListaTipoMotivoGuia()) {
            if (item.getDesParametroDet().startsWith(desMotivoGuia)) {
                listaMotivos.add(item);
            }
        }
        return listaMotivos;
    }

    public void copyPartidaDestino(ActionEvent event) {
        if (bkGuiaDeRemision.getGuiaFormulario().getSedePartida().getId() != null) {
            BeanUtils.copyProperties(bkGuiaDeRemision.getGuiaFormulario().getSedePartida(),
                    bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada());
        } else {
            if (bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getId() != null) {
                BeanUtils.copyProperties(bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada(),
                        bkGuiaDeRemision.getGuiaFormulario().getSedePartida());
            }
        }
    }

    public boolean isRenderedColumn(String estado) {
        return estado.equalsIgnoreCase("A") || estado.equals("");
    }

    // Fin Logica para el formulario
    @Override
    public String actualizar() {
        String URL = URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
        ResultadoServicio resultadoServicio;
        try {
            GuiaRemision guiaRemision = bkGuiaDeRemision.getGuiaFormulario();
            guiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            guiaRemision.setFecModificacion(new Date());

            resultadoServicio = servicioGuiaRemision
                    .actualizarGuiaDeRemision(guiaRemision);

            if (resultadoServicio.getEstadoResultado() == ESTADO_RESULTADO.EXITOSO) {
                mostrarMensaje(resultadoServicio.getMensaje());
                bkGuiaDeRemision.setComando(null);
                URL = URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
            } else {
                mostrarError("Mensaje de Error", resultadoServicio.getMensaje());
                URL = "NOOK";
            }

        } catch (ServiceException e) {
            mostrarError("Mensaje de Error", "Error");
            URL = "NOOK";
        }
        return URL;
    }

    @Override
    public String guardar() {
        ResultadoServicio resultadoServicio;
        String URL;

        GuiaRemision guiaRemision = bkGuiaDeRemision.getGuiaFormulario();
        guiaRemision.setFecCreacion(new Date());
        guiaRemision.setUsrCreacion(session.getUsuario().getUsuario());
        guiaRemision.setSerie(UtilitarioCadenas.formatoSerieDocumento(Integer.parseInt(guiaRemision.getSerie())));
        guiaRemision.setNumeroGuia(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(guiaRemision.getNumeroGuia())));

        resultadoServicio = servicioGuiaRemision.guardarGuiaRemision(guiaRemision);

        if (resultadoServicio.getEstadoResultado() == ESTADO_RESULTADO.EXITOSO) {
            mostrarMensaje(resultadoServicio.getMensaje());
            bkGuiaDeRemision.setComando(null);
            URL = URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
        } else {
            mostrarError("Mensaje de Error", resultadoServicio.getMensaje());
            URL = "NOOK";
        }


        //URL = "NOOK";

        return URL;
    }

    /*private GuiaRemision guardarGR() throws ServiceException {
     GuiaRemision guiaRemision = bkGuiaDeRemision.getGuiaFormulario();

        
     }*/
    @Override
    public String editar() {
        try {
            bkGuiaDeRemision.setComando(new ComandoActualizar(this));
            mbCompFindOrden.addObserver(this);
            mbCompDirLocProv.addObserver(this);
            mbCompAddArticuloStock.addObserver(this);

            bkGuiaDeRemision.setEditFormulario(true);
            Integer idGuia = bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision();

            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(idGuia);
            bkGuiaDeRemision.setGuiaFormulario(guiaRemision);
            /*bkGuiaDeRemision.setNumeroGuiaFormulario(bkGuiaDeRemision
             .getGuiaFormulario().getSerie() + "-"
             + bkGuiaDeRemision.getGuiaFormulario().getNumeroGuia());*/
            OrdenPedido ordenp = new OrdenPedido();
            ordenp.setEstadoPedido("E");
            ordenp.setIdEmpresa(session.getEmpresa());
            bkGuiaDeRemision.setListaOrdenesPedido(servicioOrdenPedido.listarOrdenesPedidoPorEstado(ordenp));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al obtener la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
        }

        return "OK";
    }

    @Override
    public String nuevo() {
        bkGuiaDeRemision.setComando(new ComandoGuardar(this));
        try {
            mbCompFindOrden.addObserver(this);
            mbCompDirLocProv.addObserver(this);
            mbCompAddArticuloStock.addObserver(this);
            mbCompOrdenPOrdenCS.addObserver(this);
            mbComponenteFindProveedor.addObserver(this);
            //bkGuiaDeRemision.setListaOrdenesPedido(bkListGuiaDeRemision.getListaOrdenesPedido());
            bkGuiaDeRemision.setEmpresaFormulario(bkListGuiaDeRemision.getEmpresaFormulario());
            bkGuiaDeRemision.setProveedoGuia(new Proveedor());
            //bkGuiaDeRemision.setListaTipoMotivoGuia(bkListGuiaDeRemision.getListaTipoMotivoGuia());

            bkCompAddArticuloStock.setDetalleGuiaFormulario(new DetalleGuiaRemision());
            bkCompAddArticuloStock.getDetalleGuiaFormulario().setArticulo(new Articulo());
            bkCompAddArticuloStock.setActivarAgregar(true);
            OrdenPedido ordenp = new OrdenPedido();
            ordenp.setEstadoPedido("E");
            ordenp.setIdEmpresa(session.getEmpresa());
            bkGuiaDeRemision.setListaOrdenesPedido(servicioOrdenPedido.listarOrdenesPedidoPorEstado(ordenp));

            //bkGuiaDeRemision.

            OrdenCompraServicio ordenCS = new OrdenCompraServicio();
            ordenCS.setIdEmpresa(session.getEmpresa());
            ordenCS.setIdOrdenPedido(new OrdenPedido(0));
            ordenCS.setCodigo("");
            ordenCS.setDescripcion("");
            ordenCS.setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.ABIERTO.getValor());
            ordenCS.setTipo('%');

            Collection<OrdenCompraServicio> listaOCS = servicioOrdenCS.buscarOrdenCompraServiciosPorFiltro(ordenCS, null, null);
            System.out.println("lista encontrada: " + listaOCS);
            mbCompOrdenPOrdenCS.initComponent(bkGuiaDeRemision.getListaOrdenesPedido(), listaOCS);
            bkGuiaDeRemision.setEditFormulario(false);
            GuiaRemision guiaNuevo = new GuiaRemision();
            /*guiaNuevo.setFechaEmision(new Date());
             guiaNuevo.setFechaInicioTraslado(new Date());*/
            guiaNuevo.setEstadoGuia(String.valueOf(ESTADO_GUIA_REMISION.BORRADOR.getValor()));
            guiaNuevo.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
            guiaNuevo.setOrdenPedido(new OrdenPedido(0));
            guiaNuevo.setIdOrdenCompraServicio(new OrdenCompraServicio(0));
            guiaNuevo.setIdEmpresa(session.getEmpresa());
            guiaNuevo.setTipoCompPago(TIPO_DOC_VENTA.GUIA.getValor());
            bkGuiaDeRemision.setGuiaFormulario(guiaNuevo);


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
        }
        return "OK";
    }

    @Override
    public String ver() {
        try {
            bkGuiaDeRemision.setComando(new ComandoVer(this));
            bkGuiaDeRemision.setVerFormulario(true);
            bkGuiaDeRemision.setEditFormulario(true);

            Integer idGuia = bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision();

            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(idGuia);
            bkGuiaDeRemision.setGuiaFormulario(servicioGuiaRemision
                    .conseguirGuiaDeRemisionPorId(idGuia));
            bkGuiaDeRemision.setNumeroGuiaFormulario(bkGuiaDeRemision
                    .getGuiaFormulario().getSerie()
                    + "-" + bkGuiaDeRemision.getGuiaFormulario().getNumeroGuia());

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al obtener la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
        }
        return "OK";
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        /*bkGuiaDeRemision.setGuiaFormulario(new GuiaRemision());
         bkGuiaDeRemision.setNumeroGuiaFormulario("");
         bkGuiaDeRemision.setComando(null);
         mbCompDirLocProv.reset();*/
        return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
    }

    @Override
    public void actualizarObservador(Object object) {
        System.out.println("entroo");
        if (object instanceof Integer) {
            bkGuiaDeRemision.getGuiaFormulario().setDetalleGuiaRemisions(new ArrayList<DetalleGuiaRemision>());
            System.out.println("parametro 3: " + bkGuiaDeRemision.getGuiaFormulario().getParametroTipoGuia().getValCadena());
            if (bkGuiaDeRemision.getGuiaFormulario().getParametroTipoGuia().getValCadena()
                    .equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
                bkGuiaDeRemision.getGuiaFormulario().setSedePartida(new Sede());
            } else {
                bkGuiaDeRemision.getGuiaFormulario().setSedeLlegada(new Sede());
            }

            if ((Integer) object != 0) {

                try {
                    bkGuiaDeRemision.getGuiaFormulario().setOrdenPedido(servicioOrdenPedido.conseguirOrdenPedidoPorId((Integer) object));
                } catch (ServiceException e) {
                    mostrarError("Ocurrieron algunos problemas al obtener la informacion. Vuelva a intentar.");
                    logger.error(e.getMessage(), e);
                }

            } else {
                bkGuiaDeRemision.getGuiaFormulario().setOrdenPedido(new OrdenPedido());
            }
        } else {
            if (object instanceof BKCompDirLocProv.SedeSubjectWrapper) {
                BKCompDirLocProv.SedeSubjectWrapper subject = (SedeSubjectWrapper) object;
                if (subject.getIdObserver().equalsIgnoreCase("SEDE_PARTIDA")) {
                    bkGuiaDeRemision.getGuiaFormulario().setSedePartida(subject.getSedeCurrent());
                    bkGuiaDeRemision.getGuiaFormulario().setDetalleGuiaRemisions(new ArrayList<DetalleGuiaRemision>());
                } else {
                    if (subject.getIdObserver().equalsIgnoreCase("SEDE_LLEGADA")) {
                        bkGuiaDeRemision.getGuiaFormulario().setSedeLlegada(subject.getSedeCurrent());
                    } else {
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                }

                System.out.println("tipo de parametro: " + bkGuiaDeRemision.getGuiaFormulario().getParametroTipoGuia());

                if (bkGuiaDeRemision.getGuiaFormulario().getParametroTipoGuia().getId().intValue()
                        != Constantes.TipoGuiaRemision.GUIA_ENTRADA) {
                    if (bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getIdProveedor() != null) {
                        try {
                            Proveedor proveedorDestino = servicioSede.conseguirSedePorId(
                                    bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getId()).getIdProveedor();

                            bkGuiaDeRemision.getGuiaFormulario().setNombreDestinatario(proveedorDestino.getRazonSocial());
                            bkGuiaDeRemision.getGuiaFormulario().setDireccionDestinatario(proveedorDestino.getDireccionLegal());

                            if (proveedorDestino.getTipoEntidad().charAt(0) == TIPO_ENTIDAD.JURIDICO.getValor()) {
                                bkGuiaDeRemision.getGuiaFormulario().setRucDestinatario(proveedorDestino.getRuc());
                            } else {
                                bkGuiaDeRemision.getGuiaFormulario().setDniDestinatario(proveedorDestino.getRuc());
                            }
                        } catch (ServiceException e) {
                            mostrarError("Ocurrieron algunos problemas al obtener la informacion. Vuelva a intentar.");
                            logger.error(e.getMessage(), e);
                        }
                    } else if (bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getIdEmpresa() != null) {
                        try {
                            Empresa proveedorDestino = servicioSede.conseguirSedePorId(
                                    bkGuiaDeRemision.getGuiaFormulario().getSedeLlegada().getId()).getIdEmpresa();

                            bkGuiaDeRemision.getGuiaFormulario().setNombreDestinatario(proveedorDestino.getRazonSocial());
                            bkGuiaDeRemision.getGuiaFormulario().setDireccionDestinatario(proveedorDestino.getDireccionLegal());
                            bkGuiaDeRemision.getGuiaFormulario().setRucDestinatario(proveedorDestino.getRuc());

                        } catch (ServiceException e) {
                            mostrarError("Ocurrieron algunos problemas al obtener la informacion. Vuelva a intentar.");
                            logger.error(e.getMessage(), e);
                        }
                    } else {
                        bkGuiaDeRemision.getGuiaFormulario().setNombreDestinatario("");
                        bkGuiaDeRemision.getGuiaFormulario().setDireccionDestinatario("");
                        bkGuiaDeRemision.getGuiaFormulario().setRucDestinatario("");
                        bkGuiaDeRemision.getGuiaFormulario().setDniDestinatario("");
                    }
                }

            } else if (object instanceof Proveedor) {
                try {
                    //Proveedor proveedor = servicioProveedor.conseguirProveedorPorId(((Proveedor) object).getId());
                    bkGuiaDeRemision.setProveedoGuia((Proveedor) object);
                    //bkGuiaDeRemisionIN.getProveedoGuia().setCourier(proveedor.getRazonSocial());

                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                DetalleGuiaRemision detalle = (DetalleGuiaRemision) object;
                //System.out.println("entrooo " + detalle.getArticulo().getNombreComercial());
                detalle.setGuiaRemision(bkGuiaDeRemision.getGuiaFormulario());
                bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().add(detalle);
                //System.out.println("detalles: " + bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions());
            }
        }

    }

    protected void buscarMaterialesPorOrden(OrdenCompraServicio ordenCS) {
        try {
            bkGuiaDeRemision.setListaMaterialEnServicio(kardexModel.buscarMaterialesPorOrdenServicio(ordenCS));
            System.out.println("lista de tooooooooodos: " + bkGuiaDeRemision.getListaMaterialEnServicio());
        } catch (ModelExcepcion e) {
            logger.info(e.getMessage(), e);
        }
    }

    protected void addDetalleGuiaRemision(Collection<DetalleOrdenCompraServicio> listaDerOrdenCS,
            Character tipo) {

        List<DetalleGuiaRemision> listaDetGuia = new ArrayList<DetalleGuiaRemision>();
        GuiaRemision guiaRemision = bkGuiaDeRemision.getGuiaFormulario();
        for (DetalleOrdenCompraServicio item : listaDerOrdenCS) {
            int inicio = 1;
            int fin = 1;

            if (!item.getPartidaDespachoCollection().isEmpty()) {
                fin = item.getPartidaDespachoCollection().size();
            }
            while (inicio <= fin) {
                DetalleGuiaRemision detalle = addDetalleGuiaDeRemision(
                        guiaRemision, item, item.getIdArticulo(), BigDecimal.ZERO,
                        item.getIdTipoUnidadMinima(), item.getUnidadMedidaForm(), "");
                listaDetGuia.add(detalle);
                inicio++;
            }

        }
        bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().clear();
        bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().addAll(listaDetGuia);

    }

    protected DetalleGuiaRemision addDetalleGuiaDeRemision(
            GuiaRemision guiaRemision, DetalleOrdenCompraServicio item,
            Articulo articulo, BigDecimal cantidad, TipoUnidadMinima tUnidMin,
            String undMedForm, String partidaLote) {

        DetalleGuiaRemision detalle = new DetalleGuiaRemision();
        detalle.setArticulo(articulo);
        detalle.setCantidad(cantidad);
        detalle.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.ACTIVO.getValor()));
        detalle.setTipoUnidadMinima(tUnidMin);
        detalle.setUnidadMedida(undMedForm);
        detalle.setCantidadEmpaque(new BigDecimal(0.0));
        detalle.setFecCreacion(new Date());
        detalle.setUsrCreacion(session.getUsuario().getUsuario());
        detalle.setGuiaRemision(guiaRemision);
        detalle.setDetalleOrdenCompraServicio(item);
        detalle.setPartidaLote(partidaLote);
        return detalle;

    }

    public void editarArticuloGR(RowEditEvent event) {
        DetalleGuiaRemision detGuiaRemision = (DetalleGuiaRemision) event.getObject();
        if (detGuiaRemision.getId() != null) {
            Integer index = this.bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().indexOf(detGuiaRemision);
            detGuiaRemision.setFecModificacion(new Date());
            detGuiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().set(index, detGuiaRemision);
        }
    }

    public void eliminarArticuloGR() {

        DetalleGuiaRemision detGuiaRemision = bkGuiaDeRemision.getCurrentDetGuiaRemision();
        if (detGuiaRemision.getId() == null) {

            Iterator itr = bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().iterator();
            while (itr.hasNext()) {
                DetalleGuiaRemision det = (DetalleGuiaRemision) itr.next();
                if (detGuiaRemision.getArticulo().equals(det.getArticulo())
                        && detGuiaRemision.getPartidaLote().equals(det.getPartidaLote())) {
                    itr.remove();
                    break;
                }
            }

        } else {

            Integer index = this.bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().indexOf(detGuiaRemision);
            detGuiaRemision.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.INACTIVO.getValor()));
            detGuiaRemision.setFecModificacion(new Date());
            detGuiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().set(index, detGuiaRemision);

        }
    }

    /*public String imprimirVer() {
     try {
     GuiaRemisionPrintHelper.imprimir(bkGuiaDeRemision.getGuiaFormulario());
     } catch (PrinterException e) {
     e.printStackTrace();
     }
     return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
     }*/
    public String generar() throws ServiceException, ModelExcepcion {
        String URL = null;


        bkGuiaDeRemision.getGuiaFormulario().setEstadoGuia(
                String.valueOf(ESTADO_GUIA_REMISION.EMITIDO.getValor()));
        BigDecimal total = BigDecimal.ZERO;
        String unidad = "";
        for (DetalleGuiaRemision det : bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions()) {
            if (det.getEstadoRegistro().equalsIgnoreCase("" + ESTADO_REGISTRO.ACTIVO.getValor())) {
                total = total.add(det.getCantidad());
            }
            if (total.doubleValue() > 0 && unidad.equalsIgnoreCase("")) {
                unidad = det.getTipoUnidadMinima().getAbrev();
            }
        }
        bkGuiaDeRemision.getGuiaFormulario().setCantidadTotal(total);
        bkGuiaDeRemision.getGuiaFormulario().setUnidad(unidad);
        boolean esSalida = bkGuiaDeRemision.getGuiaFormulario().getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_SALIDA ? true : false;

        if (esSalida && !GuiaRemisionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
        }
        
        if (!bkGuiaDeRemision.isEditFormulario()) {
            URL = guardar();
        } else {
            URL = actualizar();
        }



        try {
            if (esSalida) {
                GuiaRemisionPrintHelper.imprimir(bkGuiaDeRemision.getGuiaFormulario(), session.getSede().getRecursoImpresora());
                mostrarMensaje("Se lanzó la impresión satisfactoriamente.");
            }
            
        } catch (PrinterException e) {
            mostrarError("No se pudo realizar la impresión");
            e.printStackTrace();
            return URLPaginacion.GuiasDeRemision.URL_FORMULARIO_GUIA_REMISION_OUT;
        }
        if (URL.equalsIgnoreCase(URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION)) {



            if (!esSalida) {
                kardexModel.realizarKardex(bkGuiaDeRemision.getGuiaFormulario(), session.getUsuario().getUsuario());

            } 
            GuiaRemision guia = bkListGuiaDeRemision.getGuiaBusqueda();

            guia.setOrdenPedido(bkListGuiaDeRemision.getOrdenPedidoBusqueda());

            bkListGuiaDeRemision.setListaGuiasDeRemision(servicioGuiaRemision.obtenerGuiaRemisionBusqueda(guia, bkListGuiaDeRemision.getFechaInicio(), bkListGuiaDeRemision.getFechaFinal()));
        }

        System.out.println(bkGuiaDeRemision.getGuiaFormulario());
        return URL;
    }

    public void limpiarTablaArticulos() {
        bkGuiaDeRemision.getGuiaFormulario().getDetalleGuiaRemisions().clear();
    }
}
